home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-10-10 | 6.5 KB | 185 lines | [TEXT/MMCC] |
-
- #include "AbstractData.h"
-
- //
- // For memcpy
- //
- #include <string.h>
-
- //
- // Global list of compare behaviors
- //
- TAbstractCompareBehavior* TConstDataReference::fFirstBehavior = nil;
-
- //--------------------------------------------------------------------------------
- // TAbstractCompareBehavior::TAbstractCompareBehavior
- //--------------------------------------------------------------------------------
- TAbstractCompareBehavior::TAbstractCompareBehavior()
- {
- fNextBehavior = nil;
- }
-
- //--------------------------------------------------------------------------------
- // TAbstractCompareBehavior::CompareDynamicBehavior
- //
- // Compare behaviors should look for data types they can compare
- //--------------------------------------------------------------------------------
- CompareEnumeration TAbstractCompareBehavior::CompareDynamicBehavior(const TConstDataReference& object1, const TConstDataReference& object2) const
- {
- if(fNextBehavior)
- return fNextBehavior->CompareDynamicBehavior(object1, object2);
- else
- return TConstDataReference::CompareDefaultBehavior(object1, object2);
- }
-
- //--------------------------------------------------------------------------------
- // TAbstractCompareBehavior::ContainsDynamicBehavior
- //--------------------------------------------------------------------------------
- Boolean TAbstractCompareBehavior::ContainsDynamicBehavior(const TConstDataReference& object1, const TConstDataReference& object2) const
- {
- if(fNextBehavior)
- return fNextBehavior->ContainsDynamicBehavior(object1, object2);
- else
- return TConstDataReference::ContainsDefaultBehavior(object1, object2);
- }
-
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::CopyTo
- //--------------------------------------------------------------------------------
- long TConstDataReference::CopyTo(char* destination, long maxBytesToCopy) const
- {
- long bytesToCopy = (fDataLength > maxBytesToCopy) ? maxBytesToCopy : fDataLength;
-
- memcpy(destination, fData, bytesToCopy);
-
- return bytesToCopy;
- } // TConstDataReference::CopyTo
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::AddCompareBehavoir
- //--------------------------------------------------------------------------------
- void TConstDataReference::AddCompareBehavoir(TAbstractCompareBehavior* behavior)
- {
- if(fFirstBehavior != nil)
- behavior->SetNextBehavior(fFirstBehavior);
-
- fFirstBehavior = behavior;
- } // TConstDataReference::AddCompareBehavoir
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::Compare
- //--------------------------------------------------------------------------------
- CompareEnumeration TConstDataReference::Compare(const TConstDataReference& object1, const TConstDataReference& object2)
- {
- if(fFirstBehavior)
- return fFirstBehavior->CompareDynamicBehavior(object1, object2);
- else
- return TConstDataReference::CompareDefaultBehavior(object1, object2);
- }
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::Compare
- //--------------------------------------------------------------------------------
- CompareEnumeration TConstDataReference::Compare(const TConstDataReference& object2) const
- {
- return TConstDataReference::Compare(*this, object2);
- }
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::CompareDefaultBehavior
- //
- // If none of the compare behaviors know how to do the data comparison, then
- // assume a simple byte-stream compare is good enough (works for C Strings)
- //--------------------------------------------------------------------------------
- CompareEnumeration TConstDataReference::CompareDefaultBehavior(const TConstDataReference& object1, const TConstDataReference& object2)
- {
- const char* object1Data = object1.Data();
- const char* object2Data = object2.Data();
- long object1Length = object1.DataLength();
- long object2Length = object2.DataLength();
- long bytesToCompare = object1Length > object2Length ? object2Length : object1Length;
-
- //
- // Scan through the first N bytes; stop comparing
- // as soon as an unequal section is found
- //
- while(bytesToCompare)
- {
- if(*object2Data < *object1Data)
- return kSecondObjectComesBefore;
- if(*object2Data > *object1Data)
- return kSecondObjectComesAfter;
-
- ++object1Data;
- ++object2Data;
- --bytesToCompare;
- }
-
- //
- // If the first N bytes of both data streams are
- // the same, then the shorter structure comes before.
- //
- if(object2Length < object1Length)
- return kSecondObjectComesBefore;
- if(object2Length > object1Length)
- return kSecondObjectComesAfter;
-
- //
- // Every byte is equal & the length is the same,
- // so the two objects are equal
- //
- return kObjectKeysEqual;
- }
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::Contains
- //--------------------------------------------------------------------------------
- Boolean TConstDataReference::Contains(const TConstDataReference& object2) const
- {
- if(fFirstBehavior)
- return fFirstBehavior->ContainsDynamicBehavior(*this, object2);
- else
- return TConstDataReference::ContainsDefaultBehavior(*this, object2);
- }
-
- //--------------------------------------------------------------------------------
- // TConstDataReference::ContainsDefaultBehavior
- //--------------------------------------------------------------------------------
- Boolean TConstDataReference::ContainsDefaultBehavior(const TConstDataReference& object1, const TConstDataReference& object2)
- {
- long sizeDifference = object1.DataLength() - object2.DataLength();
- const char* dataStart = object1.Data();
- Boolean isContained = false;
-
- while(sizeDifference >= 0)
- {
- TConstDataReference containsTest(object1.DataType(), dataStart, object2.DataLength());
- if(containsTest.Compare(object2) == kObjectKeysEqual)
- {
- isContained = true;
- break;
- }
- ++dataStart;
- --sizeDifference;
- }
-
- return isContained;
- } // TConstDataReference::ContainsDefaultBehavior
-
- //--------------------------------------------------------------------------------
- // TUpdataDataReference::CopyFrom
- //--------------------------------------------------------------------------------
- Boolean TUpdataDataReference::CopyFrom(const TConstDataReference& source, Boolean allowDataToClip)
- {
- Boolean copyFits = source.DataLength() <= fMaxLength;
-
- if(copyFits || allowDataToClip)
- {
- fDataLength = source.CopyTo(fData, fMaxLength);
- fDataType = source.DataType();
- }
-
- return copyFits;
- } // TUpdataDataReference::CopyFrom
-